home *** CD-ROM | disk | FTP | other *** search
- unit OnlyOne;
-
- { * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
- OnlyOne, version 1.00, Freeware
- A Delphi 2.0 component
- composed by Gary Nielsen, 3/26/96
- 70323.2610@compuserve.com
-
- Drop the OnlyOne component onto a form and only one
- instance of that window will occur. Any attempt to make
- a second instance will restore the previous window.
-
- caveat artifex:
- Use this component at your own risk. OnlyOne may not
- work with applications that change their title bar, or
- with applications that have names longer than 20 chars.
- I have only tested this component on a limited number
- of programs, so treat it as 'alpha'-ware.
-
- Acknowledgements:
- To make this into a component, I used Steven L. Keyser's
- JustOne component as a template. I also derived some code
- from PC Mag's Michael J. Mefford's PicAlbum utility,
- in which hPrevInst is used, but, according to the
- documentation, hPrevInst always equals NULL with Delphi 2
- and Win95.
-
- Please, if you modify or enhance this code, drop me a
- note so that I can learn from your work.
-
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
-
- interface
-
- uses
- SysUtils, Windows, Messages, Classes, Graphics, Controls,
- Forms, Dialogs;
-
- type
- TOnlyOne = class(TComponent)
- private
- public
- constructor Create(AOwner:TComponent); override;
- destructor Destroy; override;
- published
- end;
-
- procedure Register;
- procedure LookForPreviousInstance;
-
- var
- AtomText: array[0..31] of Char;
-
- implementation
-
- procedure Register;
- begin
- RegisterComponents('Win95', [TOnlyOne]);
- end;
-
- procedure LookForPreviousInstance;
- var
- PreviousInstanceWindow : hWnd;
- AppName : array[0..30] of char;
- FoundAtom : TAtom;
- begin
- {put the app name into AtomText}
- StrFmt(AtomText, 'OnlyOne%s', [Copy(Application.Title,1,20)]);
- {check to see if there's a global atom based on the app name }
- FoundAtom := GlobalFindAtom(AtomText);
- if FoundAtom <> 0 then {another instance exists}
- begin
- {get the app name into a pointer string }
- StrFmt(AppName,'%s', [Application.Title]);
- {change current title so that FindWindow doesn't see it }
- Application.Title := 'destroy me';
- {locate the previous instance of the app }
- PreviousInstanceWindow := FindWindow(nil,AppName);
- {give focus to the previous instance of the app }
- if PreviousInstanceWindow <> 0 then
- if IsIconic(PreviousInstanceWindow) then
- ShowWindow(PreviousInstanceWindow,SW_RESTORE)
- else
- BringWindowToTop(PreviousInstanceWindow);
- {stop the current instance of the application }
- Application.Terminate;
- end;
- { make the global atom so no other instances can occur }
- FoundAtom := GlobalAddAtom(AtomText);
- end;
-
- constructor TOnlyOne.Create(AOwner:TComponent);
- begin
- inherited Create(AOwner);
- LookForPreviousInstance;
- end;
-
- destructor TOnlyOne.Destroy;
- var
- FoundAtom : TAtom;
- ValueReturned : word;
- begin
- { must not forget to remove the global atom, so first
- check to see if there's a global atom already }
- FoundAtom := GlobalFindAtom(AtomText);
- if FoundAtom <> 0 then {and now remove that atom}
- ValueReturned := GlobalDeleteAtom(FoundAtom);
- inherited Destroy;
- end;
-
- end.